added a new internal type GTK_TYPE_IDENTIFIER which is derived from
authorTim Janik <timj@gtk.org>
Fri, 10 Jul 1998 02:33:06 +0000 (02:33 +0000)
committerTim Janik <timj@src.gnome.org>
Fri, 10 Jul 1998 02:33:06 +0000 (02:33 +0000)
Fri Jul 10 04:20:35 1998  Tim Janik  <timj@gtk.org>

        * gtk/gtktypeutils.h:
        * gtk/gtktypeutils.c: added a new internal type GTK_TYPE_IDENTIFIER
        which is derived from GTK_TYPE_STRING.

        * gtk/gtkbindings.c: reworked the argument type handling.

ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkbindings.c
gtk/gtkbindings.h
gtk/gtktypeutils.c
gtk/gtktypeutils.h

index 4f8cc96116cf2ce9488477937560190a8dd607a9..f768c3f1521dc723e0dcc91a9032f9072d6243ab 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Fri Jul 10 04:20:35 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtktypeutils.h: 
+       * gtk/gtktypeutils.c: added a new internal type GTK_TYPE_IDENTIFIER
+       which is derived from GTK_TYPE_STRING.
+
+       * gtk/gtkbindings.c: reworked the argument type handling.
+
 Thu Jul  9 21:03:19 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
 
        * gtk/gtkpreview.c: add in just enough support for 1 or 4 bits
index 4f8cc96116cf2ce9488477937560190a8dd607a9..f768c3f1521dc723e0dcc91a9032f9072d6243ab 100644 (file)
@@ -1,3 +1,11 @@
+Fri Jul 10 04:20:35 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtktypeutils.h: 
+       * gtk/gtktypeutils.c: added a new internal type GTK_TYPE_IDENTIFIER
+       which is derived from GTK_TYPE_STRING.
+
+       * gtk/gtkbindings.c: reworked the argument type handling.
+
 Thu Jul  9 21:03:19 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
 
        * gtk/gtkpreview.c: add in just enough support for 1 or 4 bits
index 4f8cc96116cf2ce9488477937560190a8dd607a9..f768c3f1521dc723e0dcc91a9032f9072d6243ab 100644 (file)
@@ -1,3 +1,11 @@
+Fri Jul 10 04:20:35 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtktypeutils.h: 
+       * gtk/gtktypeutils.c: added a new internal type GTK_TYPE_IDENTIFIER
+       which is derived from GTK_TYPE_STRING.
+
+       * gtk/gtkbindings.c: reworked the argument type handling.
+
 Thu Jul  9 21:03:19 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
 
        * gtk/gtkpreview.c: add in just enough support for 1 or 4 bits
index 4f8cc96116cf2ce9488477937560190a8dd607a9..f768c3f1521dc723e0dcc91a9032f9072d6243ab 100644 (file)
@@ -1,3 +1,11 @@
+Fri Jul 10 04:20:35 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtktypeutils.h: 
+       * gtk/gtktypeutils.c: added a new internal type GTK_TYPE_IDENTIFIER
+       which is derived from GTK_TYPE_STRING.
+
+       * gtk/gtkbindings.c: reworked the argument type handling.
+
 Thu Jul  9 21:03:19 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
 
        * gtk/gtkpreview.c: add in just enough support for 1 or 4 bits
index 4f8cc96116cf2ce9488477937560190a8dd607a9..f768c3f1521dc723e0dcc91a9032f9072d6243ab 100644 (file)
@@ -1,3 +1,11 @@
+Fri Jul 10 04:20:35 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtktypeutils.h: 
+       * gtk/gtktypeutils.c: added a new internal type GTK_TYPE_IDENTIFIER
+       which is derived from GTK_TYPE_STRING.
+
+       * gtk/gtkbindings.c: reworked the argument type handling.
+
 Thu Jul  9 21:03:19 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
 
        * gtk/gtkpreview.c: add in just enough support for 1 or 4 bits
index 4f8cc96116cf2ce9488477937560190a8dd607a9..f768c3f1521dc723e0dcc91a9032f9072d6243ab 100644 (file)
@@ -1,3 +1,11 @@
+Fri Jul 10 04:20:35 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtktypeutils.h: 
+       * gtk/gtktypeutils.c: added a new internal type GTK_TYPE_IDENTIFIER
+       which is derived from GTK_TYPE_STRING.
+
+       * gtk/gtkbindings.c: reworked the argument type handling.
+
 Thu Jul  9 21:03:19 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
 
        * gtk/gtkpreview.c: add in just enough support for 1 or 4 bits
index 4f8cc96116cf2ce9488477937560190a8dd607a9..f768c3f1521dc723e0dcc91a9032f9072d6243ab 100644 (file)
@@ -1,3 +1,11 @@
+Fri Jul 10 04:20:35 1998  Tim Janik  <timj@gtk.org>
+
+       * gtk/gtktypeutils.h: 
+       * gtk/gtktypeutils.c: added a new internal type GTK_TYPE_IDENTIFIER
+       which is derived from GTK_TYPE_STRING.
+
+       * gtk/gtkbindings.c: reworked the argument type handling.
+
 Thu Jul  9 21:03:19 CDT 1998 Shawn T. Amundson <amundson@gtk.org>
 
        * gtk/gtkpreview.c: add in just enough support for 1 or 4 bits
index 50222147d30e048816f6a90e2d11bf3942709682..a7193d80324f0a37453276a8da9e9d5275107b8e 100644 (file)
 /* --- defines --- */
 #define        BINDING_MOD_MASK()      (gtk_accelerator_get_default_mod_mask () | GDK_RELEASE_MASK)
 
-#define        BINDING_TYPE_INT        (GTK_TYPE_INT)
-#define        BINDING_TYPE_LONG       (GTK_TYPE_LONG)
-#define        BINDING_TYPE_FLOAT      (GTK_TYPE_FLOAT)
-#define        BINDING_TYPE_DOUBLE     (GTK_TYPE_DOUBLE)
-#define        BINDING_TYPE_STRING     (GTK_TYPE_STRING)
-#define        BINDING_TYPE_IDENTIFIER (42)
-
 
 /* --- variables --- */
 static GHashTable      *binding_entry_hash_table = NULL;
@@ -68,8 +61,7 @@ binding_signal_free (GtkBindingSignal *sig)
   
   for (i = 0; i < sig->n_args; i++)
     {
-      if (sig->args[i].arg_type == BINDING_TYPE_STRING ||
-         sig->args[i].arg_type == BINDING_TYPE_IDENTIFIER)
+      if (GTK_FUNDAMENTAL_TYPE (sig->args[i].arg_type) == GTK_TYPE_STRING)
        g_free (sig->args[i].d.string_data);
     }
   g_free (sig->args);
@@ -270,47 +262,57 @@ binding_compose_params (GtkBindingArg     *args,
   valid = TRUE;
   for (i = 0; i < query->nparams && valid; i++)
     {
+      GtkType param_ftype;
+
       params->type = *types;
       params->name = NULL;
-      switch (args->arg_type)
+      param_ftype = GTK_FUNDAMENTAL_TYPE (params->type);
+      switch (GTK_FUNDAMENTAL_TYPE (args->arg_type))
        {
-       case  BINDING_TYPE_DOUBLE:
-         if (params->type == GTK_TYPE_FLOAT)
+       case  GTK_TYPE_DOUBLE:
+         if (param_ftype == GTK_TYPE_FLOAT)
            GTK_VALUE_FLOAT (*params) = args->d.double_data;
-         else if (params->type == GTK_TYPE_DOUBLE)
+         else if (param_ftype == GTK_TYPE_DOUBLE)
            GTK_VALUE_DOUBLE (*params) = args->d.double_data;
          else
            valid = FALSE;
          break;
-       case  BINDING_TYPE_LONG:
-         if (params->type == GTK_TYPE_BOOL &&
+       case  GTK_TYPE_LONG:
+         if (param_ftype == GTK_TYPE_BOOL &&
              (args->d.long_data == 0 ||
               args->d.long_data == 1))
            GTK_VALUE_BOOL (*params) = args->d.long_data;
-         else if (params->type == GTK_TYPE_INT)
+         else if (param_ftype == GTK_TYPE_INT ||
+                  param_ftype == GTK_TYPE_ENUM)
            GTK_VALUE_INT (*params) = args->d.long_data;
-         else if (params->type == GTK_TYPE_UINT &&
+         else if ((param_ftype == GTK_TYPE_UINT ||
+                   param_ftype == GTK_TYPE_FLAGS) &&
                   args->d.long_data >= 0)
            GTK_VALUE_UINT (*params) = args->d.long_data;
-         else if (params->type == GTK_TYPE_LONG)
+         else if (param_ftype == GTK_TYPE_LONG)
            GTK_VALUE_LONG (*params) = args->d.long_data;
-         else if (params->type == GTK_TYPE_ULONG &&
+         else if (param_ftype == GTK_TYPE_ULONG &&
                   args->d.long_data >= 0)
            GTK_VALUE_ULONG (*params) = args->d.long_data;
-         else if (params->type == GTK_TYPE_FLOAT)
+         else if (param_ftype == GTK_TYPE_FLOAT)
            GTK_VALUE_FLOAT (*params) = args->d.long_data;
-         else if (params->type == GTK_TYPE_DOUBLE)
+         else if (param_ftype == GTK_TYPE_DOUBLE)
            GTK_VALUE_DOUBLE (*params) = args->d.long_data;
          else
            valid = FALSE;
          break;
-       case  BINDING_TYPE_STRING:
-         if (params->type == GTK_TYPE_STRING)
+       case  GTK_TYPE_STRING:
+         if (param_ftype == GTK_TYPE_STRING)
            GTK_VALUE_STRING (*params) = args->d.string_data;
+         else if (param_ftype == GTK_TYPE_ENUM ||
+                  param_ftype == GTK_TYPE_FLAGS)
+           {
+             /* FIXME: we need identifier lookups here */
+             valid = FALSE;
+           }
          else
            valid = FALSE;
          break;
-       case  BINDING_TYPE_IDENTIFIER:
        default:
          valid = FALSE;
          break;
@@ -566,26 +568,28 @@ gtk_binding_entry_add_signall (GtkBindingSet  *binding_set,
          binding_signal_free (signal);
          return;
        }
-      arg->arg_type = tmp_arg->arg_type;
-      switch (tmp_arg->arg_type)
+      switch (GTK_FUNDAMENTAL_TYPE (tmp_arg->arg_type))
        {
-       case  BINDING_TYPE_INT:
-       case  BINDING_TYPE_LONG:
+       case  GTK_TYPE_LONG:
+         arg->arg_type = GTK_TYPE_LONG;
          arg->d.long_data = tmp_arg->d.long_data;
          break;
-       case  BINDING_TYPE_FLOAT:
-       case  BINDING_TYPE_DOUBLE:
+       case  GTK_TYPE_DOUBLE:
+         arg->arg_type = GTK_TYPE_DOUBLE;
          arg->d.double_data = tmp_arg->d.double_data;
          break;
-       case  BINDING_TYPE_STRING:
-         if (!tmp_arg->d.string_data)
+       case  GTK_TYPE_STRING:
+          if (tmp_arg->arg_type != GTK_TYPE_IDENTIFIER)
+           arg->arg_type = GTK_TYPE_STRING;
+         else
+           arg->arg_type = GTK_TYPE_IDENTIFIER;
+         arg->d.string_data = g_strdup (tmp_arg->d.string_data);
+         if (!arg->d.string_data)
            {
              g_warning ("gtk_binding_entry_add_signall(): value of `string' arg[%u] is `NULL'", n);
-             arg->d.string_data = NULL;
              binding_signal_free (signal);
              return;
            }
-         arg->d.string_data = g_strdup (tmp_arg->d.string_data);
          break;
        default:
          g_warning ("gtk_binding_entry_add_signall(): unsupported type `%s' for arg[%u]",
@@ -637,28 +641,51 @@ gtk_binding_entry_add_signal (GtkBindingSet  *binding_set,
       slist = g_slist_prepend (slist, arg);
 
       arg->arg_type = va_arg (args, GtkType);
-      switch (arg->arg_type)
+      switch (GTK_FUNDAMENTAL_TYPE (arg->arg_type))
        {
-       case  BINDING_TYPE_INT:
+       case GTK_TYPE_CHAR:
+         arg->arg_type = GTK_TYPE_LONG;
+         arg->d.long_data = va_arg (args, gchar);
+         break;
+       case GTK_TYPE_BOOL:
+         arg->arg_type = GTK_TYPE_LONG;
+         arg->d.long_data = va_arg (args, gboolean) != 0;
+         break;
+       case GTK_TYPE_INT:
+       case GTK_TYPE_UINT:
+         arg->arg_type = GTK_TYPE_LONG;
          arg->d.long_data = va_arg (args, gint);
          break;
-       case  BINDING_TYPE_LONG:
+       case GTK_TYPE_LONG:
+       case GTK_TYPE_ULONG:
+         arg->arg_type = GTK_TYPE_LONG;
          arg->d.long_data = va_arg (args, glong);
          break;
-       case  BINDING_TYPE_FLOAT:
+       case GTK_TYPE_FLOAT:
+         arg->arg_type = GTK_TYPE_DOUBLE;
          arg->d.double_data = va_arg (args, gfloat);
          break;
-       case  BINDING_TYPE_DOUBLE:
+       case GTK_TYPE_DOUBLE:
+         arg->arg_type = GTK_TYPE_DOUBLE;
          arg->d.double_data = va_arg (args, gdouble);
          break;
-       case  BINDING_TYPE_STRING:
+       case GTK_TYPE_STRING:
+         if (arg->arg_type != GTK_TYPE_IDENTIFIER)
+           arg->arg_type = GTK_TYPE_STRING;
          arg->d.string_data = va_arg (args, gchar*);
          if (!arg->d.string_data)
            {
-             g_warning ("gtk_binding_entry_add_signal(): value of `string' arg[%u] is `NULL'", i);
+             g_warning ("gtk_binding_entry_add_signal(): type `%s' arg[%u] is `NULL'",
+                        gtk_type_name (arg->arg_type),
+                        i);
              i += n_args + 1;
            }
          break;
+       case GTK_TYPE_ENUM:
+       case GTK_TYPE_FLAGS:
+         arg->arg_type = GTK_TYPE_LONG;
+         arg->d.long_data = va_arg (args, gint);
+         break;
        default:
          g_warning ("gtk_binding_entry_add_signal(): unsupported type `%s' for arg[%u]",
                     gtk_type_name (arg->arg_type), i);
index 15df76b3cb2502f2352e8cc3c26670f4e03eb26d..fc3012ba62cab91a0bb9fa71f7fe85f0a72654c8 100644 (file)
@@ -113,8 +113,9 @@ struct _GtkBindingArg
   } d;
 };
 
-/* Binding sets
- */
+
+/* Application-level methods */
+
 GtkBindingSet* gtk_binding_set_new     (const gchar    *set_name);
 GtkBindingSet* gtk_binding_set_by_class(gpointer        object_class);
 GtkBindingSet* gtk_binding_set_find    (const gchar    *set_name);
@@ -129,26 +130,29 @@ gboolean gtk_binding_set_activate (GtkBindingSet  *binding_set,
 void    gtk_binding_entry_clear        (GtkBindingSet  *binding_set,
                                         guint           keyval,
                                         guint           modifiers);
-void    gtk_binding_entry_remove       (GtkBindingSet  *binding_set,
-                                        guint           keyval,
-                                        guint           modifiers);
 void    gtk_binding_entry_add_signal   (GtkBindingSet  *binding_set,
                                         guint           keyval,
                                         guint           modifiers,
                                         const gchar    *signal_name,
                                         guint           n_args,
                                         ...);
-void    gtk_binding_entry_add_signall  (GtkBindingSet  *binding_set,
-                                        guint           keyval,
-                                        guint           modifiers,
-                                        const gchar    *signal_name,
-                                        GSList         *binding_args);
 void    gtk_binding_set_add_path       (GtkBindingSet  *binding_set,
                                         GtkPathType     path_type,
                                         const gchar    *path_pattern,
                                         GtkPathPriorityType priority);
 
 
+/* Non-public methods */
+
+void    gtk_binding_entry_remove       (GtkBindingSet  *binding_set,
+                                        guint           keyval,
+                                        guint           modifiers);
+void    gtk_binding_entry_add_signall  (GtkBindingSet  *binding_set,
+                                        guint           keyval,
+                                        guint           modifiers,
+                                        const gchar    *signal_name,
+                                        GSList         *binding_args);
+
 
 
 
index ac0f9323d54658d332b4aa214c4f689fc23f4283..44f240ef45fdf9d4e0c6463d3980be6e5361134e 100644 (file)
@@ -746,3 +746,14 @@ gtk_type_init_builtin_types (void)
       (*builtin_info[i].type_id) = type_id;
     }
 }
+
+GtkType
+gtk_identifier_get_type (void)
+{
+  static GtkType identifier_type = 0;
+
+  if (!identifier_type)
+    identifier_type = gtk_type_register_intern ("GtkIdentifier", GTK_TYPE_STRING, NULL);
+
+  return identifier_type;
+}
index 98e4968315c2b03ba97e8b95f3ac7f2d7e5d8a5a..bf1d8aff1b1ecb6b6c083981474fad0c6e7b6a40 100644 (file)
@@ -59,7 +59,9 @@ typedef enum
   GTK_TYPE_SIGNAL,
   GTK_TYPE_C_CALLBACK,
   
-  GTK_TYPE_OBJECT
+  GTK_TYPE_OBJECT,
+
+  GTK_FUNDAMENTAL_TYPE_LAST
 } GtkFundamentalType;
 
 typedef guint GtkType;
@@ -68,10 +70,13 @@ typedef guint GtkType;
  */
 #include <gtk/gtktypebuiltins.h>
 
+#define                GTK_TYPE_IDENTIFIER             (gtk_identifier_get_type ())
+GtkType                gtk_identifier_get_type         (void);
+
 /* Macros
  */
 #define GTK_TYPE_MAKE(parent_t, seqno)         (((seqno) << 8) | GTK_FUNDAMENTAL_TYPE (parent_t))
-#define GTK_FUNDAMENTAL_TYPE(type)             ((GtkFundamentalType) ((type) & 0xFF))
+#define GTK_FUNDAMENTAL_TYPE(type)     ((GtkFundamentalType) ((type) & 0xFF))
 #define GTK_TYPE_SEQNO(type)           ((type) > 0xFF ? (type) >> 8 : (type))
 
 typedef struct _GtkArg        GtkArg;